package chpt05.shopping;

public class ShoppingCart {
    private ItemEntry[] items;
    private int itemCount;
    private int capacity; // 购物车最大容量

    public ShoppingCart(int capacity) {
        items = new ItemEntry[capacity];
        itemCount = 0;
        this.capacity = capacity;
    }

    public void add(Commodity e) {
        if (e == null || itemCount >= capacity) {
            return; // e为空或大于等于最大容量不能添加
        }
        int index = findById(e.getId());
        if (index == -1) { // 如果不包含该商品
            items[itemCount] = new ItemEntry(e);
            itemCount++;
        } else {
            items[index].increase();
        }
    }
    
    // 从购物车减少id对应的商品条目的数量。当条目中的数量<1则删除该条目。
    public boolean remove(Integer id) {
        if (id == null) {
            return false;
        }
        int index = findById(id);
        if (index == -1) { // 未找到
            return false;
        } else {
            ItemEntry entry = items[index];
            if (entry.getQty() <= 1) { // 如果数量 <= 1, 移除条目
                for (int i = index; i < itemCount - 1; i++) {
                    items[i] = items[i + 1];
                }
                items[itemCount - 1] = null;
                itemCount--;
            } else {
                entry.decrease();
            }
        }
        return true;
    }

    // 获取内部ItemEntry的一份拷贝，然后返回
    public ItemEntry[] getItems() {
        ItemEntry[] copy = new ItemEntry[itemCount];
        System.arraycopy(items, 0, copy, 0, itemCount);
        return copy;
    }

    // 通过id在购物车中查找是否已存在相关条目。声明为private，因为只在本类中使用。
    private int findById(Integer id) {
        if (id == null) {
            return -1;
        }
        for (int i = 0; i < itemCount; i++) {
            if (items[i].getItem().getId().equals(id)) {
                return i;
            }
        }
        return -1; // Item not found
    }

    // 购物车条目类：购物车的某一个条目，包含商品与商品对应的数量。
    public static class ItemEntry {
        private Commodity item; // 商品
        private int qty;        // 数量

        public ItemEntry(Commodity item) {
            this.item = item;
            this.qty = 1;
        }

        public void increase() {
            qty++;
        }

        public void decrease() {
            if (qty > 0) {
                qty--;
            }
        }

        public Commodity getItem() {
            return item;
        }

        public Integer getQty() {
            return qty;
        }

        @Override
        public String toString() {
            return "ItemEntry [item=" + item + ", qty=" + qty + "]";
        }
    }
    
    // 结算结果类：包含商品总数量与总价格
    public static class CKResult {
        private int qty;
        private double price;

        public CKResult(int qty, double price) {
            this.qty = qty;
            this.price = price;
        }

        public int getQty() {
            return qty;
        }

        public double getPrice() {
            return price;
        }
    }

    public CKResult checkout() {
        int qty = 0;
        double totalPrice = 0;
        for (int i = 0; i < itemCount; i++) {
            ItemEntry entry = items[i];
            qty += entry.getQty();
            totalPrice += entry.getQty() * entry.getItem().getPrice();
        }
        return new CKResult(qty, totalPrice);
    }
}